package tarea2.managedbeans;

import Negocio.InterfazNegocio;
import entidades.Administrador;
import entidades.Administrativo;
import entidades.Cita;
import entidades.Enfermedad;
import entidades.ListaDeEspera;
import entidades.Medico;
import entidades.Paciente;
import entidades.Tratamiento;
import entidades.Usuario;
import java.sql.Date;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

@Named(value = "login")
@ApplicationScoped
public class LoginMBean {

    private String dni;
    private String contrasena;
    @Inject
    private UsuarioMBean usuarioMBean;
    @Inject
    private InterfazNegocio negocio;

    public LoginMBean() {

    }
    
    //Inicializa la base de datos
    @PostConstruct
    public void init() {
        Administrador adm = new Administrador("11111111A", "1", "Juan", "Manuel",
                Date.valueOf("1995-03-01"), "Juan@gmail.com", "444555666", 0);
        Medico med1 = new Medico("22222222B", "2", "Cristina", "Fernandez",
                Date.valueOf("1998-03-01"), "Cristina@hotmail.com", "123456789", "Ginecologo", 1, "Ginecologia");
        Medico med2 = new Medico("33333333C", "3", "Miguel", "Hernandez",
                Date.valueOf("1975-03-01"), "Miguel@yahoo.com", "987654321", "Emergencias", 2, "Equipo Especial");
        Paciente pac1 = new Paciente("44444444D", "444", "Paco", "Serrano",
                Date.valueOf("1991-03-01"), "Paco@gmail.com", "111222333", "123456781");
        Paciente pac2 = new Paciente("55555555E", "5", "Sofia", "Segovia",
                Date.valueOf("1990-05-01"), "Sofia@hotmail.com", "777999888", "123456782");
        Administrativo ad1 = new Administrativo("77777777F", "admin", "Shadow", "Soldier",
                Date.valueOf("1966-06-06"), "Shadow@darkness.com", "777999888", 3, "Aministración");
        negocio.registrarUsuario(adm);
        negocio.registrarUsuario(med1);
        negocio.registrarUsuario(med2);
        negocio.registrarUsuario(pac1);
        negocio.registrarUsuario(pac2);
        negocio.registrarUsuario(ad1);
        
        Enfermedad enfA = new Enfermedad("Gripe", "Baja", "Enfermedad común");
        Enfermedad enfB = new Enfermedad("Cáncer de pulmón", "Grave", "Descripción");
        Enfermedad enfC = new Enfermedad("Sarampión", "Grave", "Descripción");
        Enfermedad enfD = new Enfermedad("Sida", "Grave", "Descripción");
        negocio.añadir_Enfermedad(enfA);
        negocio.añadir_Enfermedad(enfB);
        negocio.añadir_Enfermedad(enfC);
        negocio.añadir_Enfermedad(enfD);
        
        negocio.modificar_Historia_Clinica(pac2, " ", enfA, new Tratamiento("Paracetamol","50g 12 horas"), pac2.getDni());
        negocio.modificar_Historia_Clinica(pac1, " ", enfA, new Tratamiento("Paracetamol","50g 12 horas"), pac1.getDni());

        ListaDeEspera hi = new ListaDeEspera("Trasplante de hígado");
        negocio.crear_Lista_Espera(hi);
        negocio.insertar_Lista_Espera(pac1, hi);
        negocio.insertar_Lista_Espera(pac2, hi);

        Cita c = new Cita(11, 10, 3915 - 1900, 10, 0, "Area B", "Revisión mensual", false);
        negocio.Añadir_Cita(c, med1, pac2);
        
        
    }

    public String rol(Usuario u) {
        return u.getClass().toString().substring(16, u.getClass().toString().length());
    }

    // Setters/Getters--------------------------------------------------------
    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getContrasena() {
        return contrasena;
    }

    public void setContrasena(String contrasena) {
        this.contrasena = contrasena;
    }

    public InterfazNegocio getNegocio() {
        return negocio;
    }

    public void setNegocio(InterfazNegocio negocio) {
        this.negocio = negocio;
    }

    public static String loginPage() {
        return "login";
    }

    public String autenticar() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        
        for (Medico u :negocio.getMedicos()) {
            if (u.getDni().equals(dni)) {
                if (u.getPassword().equals(contrasena)) {
                    usuarioMBean.setUsuario(u);
                    usuarioMBean.setMedico(u);
                    return usuarioMBean.home() + "?faces-redirect=true";
                } else {
                    ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "La contraseña no está corecta.", "La contraseña no está corecta."));
                    return null;
                }
            }
        }

        for (Paciente u : negocio.getPacientes()) {
            if (u.getDni().equals(dni)) {
                if (u.getPassword().equals(contrasena)) {
                    usuarioMBean.setUsuario(u);
                    return usuarioMBean.home() + "?faces-redirect=true";
                } else {
                    ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "La contraseña no está corecta.", "La contraseña no está corecta."));
                    return null;
                }
            }
        }

        for (Administrativo u : negocio.getAdministrativos()) {
            if (u.getDni().equals(dni)) {
                if (u.getPassword().equals(contrasena)) {
                    usuarioMBean.setUsuario(u);
                    return usuarioMBean.home() + "?faces-redirect=true";
                } else {
                    ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "La contraseña no está corecta.", "La contraseña no está corecta."));
                    return null;
                }
            }
        }

        for (Administrador u : negocio.getAdministrador()) {
            if (u.getDni().equals(dni)) {
                if (u.getPassword().equals(contrasena)) {
                    usuarioMBean.setUsuario(u);
                    return usuarioMBean.home() + "?faces-redirect=true";
                } else {
                    ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "La contraseña no está corecta.", "La contraseña no está corecta."));
                    return null;
                }
            }
        }

        ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Usuario no encontrado.", "Usuario no encontrado."));
        return null;
    }

    public UsuarioMBean getUsuarioMBean() {
        return usuarioMBean;
    }

    public void setUsuarioMBean(UsuarioMBean usuarioMBean) {
        this.usuarioMBean = usuarioMBean;
    }

    public String logout() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        ctx.getExternalContext().invalidateSession();
        return loginPage();
    }
}
